package com.treasure.mall.biz.service.core.live;

import com.treasure.mall.biz.base.SearchableCrudService;
import com.treasure.mall.biz.dto.live.LiveSessionCreateDTO;
import com.treasure.mall.biz.dto.live.SessionStatisticsDTO;
import com.treasure.mall.biz.entity.live.LiveSessionPO;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author allan
 * @version 1.0.0
 * @date 2020/6/13
 */
public interface LiveSessionService extends SearchableCrudService<LiveSessionPO, String> {
    /**
     * 得到某个直播间当前的直播场次
     *
     * @param roomId
     * @return 如果为空说明没有任何场次，和直播结束一样
     */
    LiveSessionPO getCurrentSession(Long roomId);

    /**
     * 创建一个预告
     *
     * @param createDTO
     * @return
     */
    @Transactional
    LiveSessionPO create(LiveSessionCreateDTO createDTO);

    /**
     * 开始一场直播
     *
     * @param roomId       直播间
     * @param sessionTitle 直播title
     * @param userId       开播的用户
     * @return
     */
    LiveSessionPO start(Long roomId, String sessionTitle, Long userId);

    /**
     * 直播结束
     *
     * @param sessionId
     */
    void stop(String sessionId);

    void stop(LiveSessionPO liveSessionPO);

    /**
     * 后台关闭
     *
     * @param roomId
     */
    void stopByRoom(Long roomId);

    /**
     * 进入直播间
     *
     * @param userId
     * @param sessionId
     */
    void userEnter(Long userId, String sessionId);

    /**
     * 添加直播活跃度
     *
     * @param sessionId
     */
    void addActivityNum(String sessionId);

    /**
     * 添加直播间活动
     *
     * @param sessionId
     * @param num
     */
    void addActivityNum(String sessionId, int num);

    /**
     * 离开直播间
     *
     * @param userId
     * @param sessionId
     */
    void userLeave(Long userId, String sessionId);

    void updateOnlineTime(Long userId, String sessionId, boolean isLeave);

    /**
     * 发生交易
     *
     * @param sessionId
     * @param amount
     */
    void deal(String sessionId, BigDecimal amount);

    /**
     * 得到统计信息
     *
     * @param sessionId
     * @return
     */
    SessionStatisticsDTO getStatistics(String sessionId);

    List<LiveSessionPO> findByRoom(Long roomId);

    void enableRobot(String sessionId, Boolean enable);

    /**
     * 检查直播状态
     *
     * @param seconds 延迟多少秒后执行
     */
    void checkLiveState(long seconds);

    /**
     * 添加进入直播间的方式
     *
     * @param userId
     * @param sessionId
     * @param scene
     */
    void addEnterRoomWay(Long userId, String sessionId, String scene);

    void sendRoomMessage(String sessionId, Long userId);

    boolean checkPlaying(Long userId);
}
